package com.design.pattern.structural.proxy.dynamicproxy;

import com.design.pattern.structural.proxy.Order;
import com.design.pattern.structural.proxy.db.DataSourceContextHolder;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * description
 *
 * @author RenQiQiang 2019/03/13 10:17
 */
public class OrderServiceDynamicProxy implements InvocationHandler {

    private Object target;

    public OrderServiceDynamicProxy(Object target) {
        this.target = target;
    }

    public Object bind() {
        Class cls = target.getClass();
        return Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(), this);
    }

    /**
     * @param proxy  几乎用不上
     * @param method 要被增强的方法对象
     * @param args   具体的method参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       Object argObject = args[0];
       beforeMethod(argObject);
       Object object = method.invoke(target, args);
       afterMethod();
       return object;
    }

    private void beforeMethod(Object obj){
        int userId = 0;
        System.out.println("动态代理 before core");
        if (obj instanceof Order){
            Order order = (Order)obj;
            userId = order.getUserId();
        }

        int dbRouter = userId % 2;
        System.out.println("动态代理分配到【db"+dbRouter+"】处理数据");
        DataSourceContextHolder.setDBType("db"+String.valueOf(dbRouter));
        System.out.println("动态代理 before code");
    }

    private void afterMethod(){
        System.out.println("动态代理 after code");
    }

}
